package structuralPattern.adapter;

/**
 * @Author: Alex Hu
 * Date: 2020/2/22 4:42 下午
 * Content:
 */

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

/**
 * XML配置文件读取工具类
 * 设计意图：提供从XML配置文件中读取对象配置的功能
 * 使用场景：当需要根据配置文件动态创建对象时使用
 */
public class ReadXML {
    /**
     * 从XML配置文件中获取对象
     * 设计意图：读取XML配置文件并创建对应的对象实例
     * 使用场景：当需要根据配置文件动态创建对象时调用
     * @return 根据配置创建的对象实例
     */
    public static Object getObject() {
        try {
            // 创建文档构建器工厂
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            // 创建文档构建器
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            // 解析XML文件
            Document doc = builder.parse(new File("src/main/java/structuralPattern/adapter/config.xml"));
            // 获取包含类名的节点
            NodeList nl = doc.getElementsByTagName("className");
            // 获取第一个节点
            Node classNode = nl.item(0).getFirstChild();
            // 获取类名
            String cName = "structuralPattern.adapter." + classNode.getNodeValue();
            // 通过类名创建对象
            Class<?> c = Class.forName(cName);
            // 返回对象实例
            return c.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
